/* @flow */

import { parse } from './parser/index'
import { optimize } from './optimizer'
import { generate } from './codegen/index'
import { createCompilerCreator } from './create-compiler'

// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
// 接收一个函数baseCompile， 此函数接收两个参数
// 右侧返回一个 func createCompiler
export const createCompiler = createCompilerCreator(
function baseCompile (
  template: string, // 模板
  options: CompilerOptions // 合并之后的选项
): CompiledResult {
  // 把模板转换成 ast 抽象语法树
  // 抽象语法树用于以树的形式，描述代码结构
  const ast = parse(template.trim(), options)
  if (options.optimize !== false) {
    // 优化抽象语法树 (优化静态节点，例如一个节点内部是纯文本内容，静态节点不需要重新渲染，patch时跳过静态子树)
    optimize(ast, options)
  }
  // 把优化后的 抽象语法树 转化成 字符串形式的 js 代码
  const code = generate(ast, options)
  // 返回 createCompiler对象
  return {
    ast,
    render: code.render, // 渲染函数
    staticRenderFns: code.staticRenderFns // 静态渲染函数，生成静态 VNode 树
  }
})
